#include <iostream>
#include <string.h>
/*
实现一个字符串类，要求能完成以下效果
myString str1;
str1 = "hello world";
cout<<*str1<<endl;//打印出"hello world";

myString str2;
str2 = str1;
cout<<*str2<<endl;//打印出"hello world";

cout<<str1+str2<<endl;//打印出"hello worldhello world"
*/
using namespace std;

class myString
{
public:
    myString()
    {
        m_data = new char[1];
        m_data[0] = '\0';
    }
    myString(const char *str)
    {
        m_data = new char[strlen(str) + 1];
        strcpy(m_data, str);
    }
    myString(const myString &str)
    {
        m_data = new char[strlen(str.m_data) + 1];
        strcpy(m_data, str.m_data);
    }
    ~myString()
    {
        if (m_data)
        {
            delete[] m_data;
            m_data = NULL;
        }
    }
    char *operator*()
    {
        return m_data;
    }
    myString &operator=(const myString &str) // 赋值运算符重载
    {
        if (this == &str)
        {
            return *this; // 防止自己赋值自己
        }
        if (m_data) // 如果m_data不为空，释放
        {
            delete[] m_data;
            m_data = NULL;
        }
        m_data = new char[strlen(str.m_data) + 1];
        strcpy(m_data, str.m_data);
        return *this;
    }
    myString operator+(const myString &str)
    {
        myString temp;
        temp.m_data = new char[strlen(m_data) + strlen(str.m_data) + 1];
        strcpy(temp.m_data, m_data);
        strcat(temp.m_data, str.m_data);
        return temp;
    }
    myString &operator=(const char *str) // 赋值运算符重载
    {
        if (m_data)
        {
            delete[] m_data;
            m_data = NULL;
        }
        m_data = new char[strlen(str) + 1];
        strcpy(m_data, str);
        return *this;
    }
    
    myString &operator+=(const myString &str)
    {
        if (m_data)
        {
            char *temp = new char[strlen(m_data) + strlen(str.m_data) + 1];
            strcpy(temp, m_data);
            strcat(temp, str.m_data);
            delete[] m_data;
            m_data = temp;
        }
    }

private:
    char *m_data;
};

int main()
{
    myString str1("Hello world");
    // myString str1;
    // str1 = "hello world";
    cout << *str1 << endl;

    myString str2(str1);
    // str2 = str1;
    cout << *str2 << endl;
    str1 = str1 + str2;
    cout << *str1 << endl;
    myString str3("hhhhhhhhhhh");
    str1 += str3;
    cout << *str1 << endl;

    return 0;
}
